package com.flyqiu.form.api.store;


import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.flyqiu.common.dict.FlyQiuDicData;
import com.flyqiu.form.model.FlyQiuTableConfigModel;
import com.flyqiu.form.model.entity.FlyQiuTableConfig;

import java.util.List;

public interface FlyQiuFormCoreService {
    /**
     * 分页查询配置信息
     *
     * @param page    分页信息
     * @param wrapper 查询条件
     * @return {@link FlyQiuTableConfig} 分页信息
     */

    Page<FlyQiuTableConfig> page(Page<FlyQiuTableConfig> page, Wrapper<FlyQiuTableConfig> wrapper);

    /**
     * 查询表单
     *
     * @param wrapper 查询条件
     * @return {@link FlyQiuTableConfig}
     */
    List<FlyQiuTableConfig> list(Wrapper<FlyQiuTableConfig> wrapper);

    /**
     * 创建表单
     *
     * @param entity 数据表配置
     */
    default void createForm(FlyQiuTableConfig entity) {
        createForm(entity, false);
    }


    /**
     * 创建表
     *
     * @param entity          表配置
     * @param synchronization 是否同步 到数据库
     */
    void createForm(FlyQiuTableConfig entity, boolean synchronization);


    /**
     * 修改表单
     *
     * @param config 表单配置
     */
    default void updateForm(FlyQiuTableConfig config) {
        updateForm(config, false);
    }

    /**
     * 创建表
     *
     * @param entity          表配置 数据表配置
     * @param synchronization 是否同步 到数据库 false 不同步
     */
    void updateForm(FlyQiuTableConfig entity, boolean synchronization);

    /**
     * 获取表单
     *
     * @param tableId 表单id
     * @return {@link FlyQiuTableConfigModel}
     */
    default FlyQiuTableConfigModel getFormModelByBId(String tableId) {
        return getFormModelByBId(tableId, false);
    }


    /**
     * 获取表单
     *
     * @param tableId       表单id
     * @param loadSqlColumn 是否加载数据库列配置信息
     * @return {@link FlyQiuTableConfigModel}
     */
    FlyQiuTableConfigModel getFormModelByBId(String tableId, boolean loadSqlColumn);

    /**
     * 获取表单
     *
     * @param formConfig    表单配置
     * @param loadSqlColumn 是否加载数据库中列信息
     * @return {@link FlyQiuTableConfigModel}
     */
    FlyQiuTableConfigModel getTableConfigModel(FlyQiuTableConfig formConfig, boolean loadSqlColumn);

    /**
     * 获取表单 此方法获取已发布的最新版本的表单
     *
     * @param formCode 表单编码
     * @return {@link FlyQiuTableConfigModel}
     */
    default FlyQiuTableConfigModel getFormByCode(String formCode) {
        return getFormByCode(formCode, false);
    }

    /**
     * 获取表单 此方法获取已发布的最新版本的表单
     *
     * @param formCode      表单编码
     * @param loadSqlColumn 是否加载数据库中列信息
     * @return {@link FlyQiuTableConfigModel}
     */
    FlyQiuTableConfigModel getFormByCode(String formCode, boolean loadSqlColumn);

    /**
     * 发布数据表
     *
     * @param tableId 数据表id
     */
    void deploymentTableById(String tableId);

    /**
     * 删除表单
     *
     * @param tableId 数据表id
     */
    void deleteForm(String tableId);

    /**
     * 获取数据表服务
     *
     * @param tableId 数据表id
     * @return {@link StoreTableService}
     */
    StoreTableService getTableEngineService(String tableId);

    /**
     * 获取数据表服务
     *
     * @param config 表单配置
     * @return {@link StoreTableService}
     */
    StoreTableService getTableEngineService(FlyQiuTableConfig config);

    /**
     * 获取数据存储服务
     *
     * @param tableId 数据表id
     * @return {@link StoreDataService}
     */
    default StoreDataService getTableDataEngineService(String tableId) {
        return getTableDataEngineService(getFormModelByBId(tableId));
    }

    /**
     * 获取数据存储服务
     *
     * @param config 表单配置
     * @return {@link StoreDataService}
     */
    StoreDataService getTableDataEngineService(FlyQiuTableConfig config);

    /**
     * 获取全部存储器
     *
     * @return {@link FlyQiuDicData}
     */
    List<FlyQiuDicData> getAllStorage();
}
